﻿using cuiail.DBModels;
using Dapper;

namespace cuiail.DBConnections
{
    public interface IPrintContentService
    {
        Task<IEnumerable<PrintContent>> GetUnPrintContentAsync();
        Task<bool> InsertPrintContentInfoAsync(string printContentInfo);
        Task<bool> UpdatePrintContentAsync(PrintContent printContent);
    }
    public class PrintContentService: IPrintContentService
    {
        private readonly IDbConnectionFactory _connectionFactory;
        public PrintContentService(IDbConnectionFactory connectionFactory)
        {
            _connectionFactory = connectionFactory;
        }

        public async Task<IEnumerable<PrintContent>> GetUnPrintContentAsync()
        {
            using var connection = _connectionFactory.CreateConnection();
            const string sql = @$"SELECT `printcontent`.`PrintContentID`,
    `printcontent`.`InsertTime`,
    `printcontent`.`IsPrintFinish`,
    `printcontent`.`FinishTime`,
    `printcontent`.`PrintContentInfo`
FROM `cuiail`.`printcontent` WHERE `printcontent`.`IsPrintFinish` = 0 
order by `printcontent`.`InsertTime` asc";
            return await connection.QueryAsync<PrintContent>(sql);
        }

        public async Task<bool> InsertPrintContentInfoAsync(string printContentInfo)
        {
            // 1. 输入参数校验（避免无效数据插入）
            if (string.IsNullOrEmpty(printContentInfo))
                throw new ArgumentNullException(nameof(printContentInfo), "插入的打印内容数据不能为空");

            // 2. 定义插入SQL（仅操作CurrentWorkMode表，InsertTime用数据库默认时间或传入值）
            // 说明：CurrentWorkModeID是自增主键，无需手动插入；InsertTime优先用实体传入值，无值则用数据库当前时间
            const string sql = @"
        INSERT INTO `PrintContent` (`PrintContentInfo`)
        VALUES (@printContent)";

            // 3. 构建参数（参数化查询，避免SQL注入）
            var parameters = new DynamicParameters();
            parameters.Add("@printContent", printContentInfo);

            // 4. 异步执行插入（管理数据库连接，返回受影响行数）
            using var connection = _connectionFactory.CreateConnection();
            int affectedRows = await connection.ExecuteAsync(sql, parameters);

            // 5. 判断插入结果（受影响行数=1表示插入成功）
            return affectedRows > 0;
        }

        public Task<bool> UpdatePrintContentAsync(PrintContent printContent)
        {
            // 1. 输入参数校验（避免无效数据插入）
            if (printContent==null)
                throw new ArgumentNullException(nameof(printContent), "更新的数据不能为空");

            // 2. 定义插入SQL（仅操作CurrentWorkMode表，InsertTime用数据库默认时间或传入值）
            // 说明：CurrentWorkModeID是自增主键，无需手动插入；InsertTime优先用实体传入值，无值则用数据库当前时间
            const string sql = @"
        UPDATE `PrintContent` set `IsPrintFinish`=@IsPrintFinish ,`FinishTime`=@FinishTime
        WHERE `PrintContentID`=@PrintContentID";
            // 3. 构建参数（参数化查询，避免SQL注入）
            var parameters = new DynamicParameters();
            parameters.Add("@IsPrintFinish", printContent.IsPrintFinish);
            parameters.Add("@FinishTime", DateTime.Now);
            parameters.Add("@PrintContentID", printContent.PrintContentID);
            // 4. 异步执行插入（管理数据库连接，返回受影响行数）
            using var connection = _connectionFactory.CreateConnection();
            int affectedRows = connection.Execute(sql, parameters);
            // 5. 判断插入结果（受影响行数=1表示插入成功）
            return Task.FromResult(affectedRows > 0);
        }
    }
}
